//
// Created by Administrator on 2025/11/9.
//
#include <front_user_updateid.h>
#include "database.h"
#include "front_user.h"

// 用户信息更新函数：用于更新当前登录用户的个人信息（用户名、密码、手机号）
int user_updateid(){
    FrontUser usid;  // 定义FrontUser类型的结构体变量，用于存储用户输入的新信息（结构体包含username、password、phone等字段）

    printf("请输入要修改的用户名:");
    scanf("%s",usid.username);
    printf("输入修改的密码:");
    scanf("%s",usid.password);
    printf("输入修改的手机号:");
    scanf("%s",usid.phone);
    const char * update_sql="update front_user set username=?,password=?, phone=?"
                            " where id=?";
    sqlite3_stmt * stmt;//预编译语句  结构体类型指针变量
    // 参数： 数据库句柄db、SQL语句、  长度（-1表示自动计算）、输出的语句句柄、未使用的部分用于存储 SQL 语句中未被编译的剩余部分
    int rc= sqlite3_prepare_v2(db,update_sql,-1,&stmt,NULL);//预编译 SQL 语句的核心函数，
    // 它将原始的 SQL 字符串，编译为 SQLite 可直接执行的字节码
    // 检查SQL语句准备是否成功
    if (rc!=SQLITE_OK){
        fprintf(stderr,"SQL语句准备失败: %s\n", sqlite3_errmsg(db));  // 输出错误信息。。
        sqlite3_finalize(stmt);  // 释放语句句柄资源
        return -1;  // 返回错误码
    }

    // 绑定参数到SQL语句的占位符（SQLite参数索引从1开始）
    // 绑定第一个参数：新用户名（文本类型）将文本类型数据绑定到预编译语句（stmt）的第 1 个参数占位符（?）
    //它是绑定参数的 “目标”，内部包含带 ? 占位符的 SQL 结构。
    sqlite3_bind_text(stmt,1,usid.username,-1,SQLITE_TRANSIENT);//绑定文本的生命周期，确保执行时数据有效。
    // 绑定第二个参数：新密码（文本类型）
    sqlite3_bind_text(stmt,2,usid.password,-1,SQLITE_TRANSIENT);
    // 绑定第三个参数：新手机号（文本类型）
    sqlite3_bind_text(stmt,3,usid.phone,-1,SQLITE_TRANSIENT);
    // 绑定第四个参数：当前登录用户ID（整数类型，用于定位要更新的用户）
    sqlite3_bind_int(stmt,4,login_user_id);//定义全局变量

    // 执行SQL语句（由于是更新操作，执行一次即可）获取每一行的代码
    sqlite3_step(stmt);

    // 获取本次更新操作影响的行数（用于判断是否更新成功）
    int row_count= sqlite3_changes(db);//整形变量

    // 根据影响行数输出结果
    if (row_count>0){//至少 1 行数据被修改，说明目标用户存在且信息有变更，输出成功提示。
        printf("更新个人信息成功！\n");
    } else{
        printf("未更新任何信息（可能信息未变化或用户ID不存在）\n");
    }

    // 释放语句句柄资源，避免内存泄漏
    sqlite3_finalize(stmt);
    return 0;
}


     // 函数执行成功，返回0
